package cn.jee.redis;

import cn.jee.redis.domain.Stu;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StuMis {
    private Jedis jedis;

    public StuMis() {
        jedis = new Jedis(); 
    }

    // 清空数据库
    public void clear() {
        jedis.flushAll();
    }

    // 产生一个学生学号
    public long newId() {
        if (jedis.exists("stu:id")) {
            return jedis.incr("stu:id");
        } else {
            jedis.set("stu:id", "1"); 
            return 1;
        }
    }
    /**
     给Stu一个学号，然后保存在stu:学号的具体值的hash表中
     同时保存java成绩在sorted set中
     保存math成绩在sorted set中
     */
    public void add(Stu stu) {
        long id = newId(); 
        stu.setId(id);
        Map<String, String> stuMap = new HashMap<>();
        stuMap.put("id", String.valueOf(id));
        stuMap.put("username", stu.getUsername());
        stuMap.put("java", String.valueOf(stu.getJava()));
        stuMap.put("math", String.valueOf(stu.getMath()));
        jedis.hmset("stu:" + id, stuMap);
        jedis.zadd("java:score", stu.getJava(), String.valueOf(id));
        jedis.zadd("math:score", stu.getMath(), String.valueOf(id));
    }

    /**数学成绩最高的5个人的姓名*/
    public String[] top5ByMath() {
        List<String> ids = jedis.zrevrange("math:score", 0, 4);
        List<String> names = new ArrayList<>();
        for (String id : ids) {
            String name = jedis.hget("stu:" + id, "username");
            names.add(name);
        }

        return names.toArray(new String[0]);
    }

    /**成绩在min和max之间的java成绩*/
    public double[] betweenJava(double min, double max) {
        List<String> ids = jedis.zrangeByScore("java:score", min, max);
        List<Double> scores = new ArrayList<>();
        for (String id : ids) {
            Double score = jedis.zscore("java:score", id);
            if (score != null) {
                scores.add(score);
            }
        }

        return scores.stream().mapToDouble(Double::doubleValue).toArray();
    }

    /**按学号查找，没有返回null*/
    public Stu findById(long id) {
        Map<String, String> stuMap = jedis.hgetAll("stu:" + id);
        if (stuMap == null || stuMap.isEmpty()) {
            return null;
        }

        Stu stu = new Stu();
        stu.setId(Long.parseLong(stuMap.get("id")));
        stu.setUsername(stuMap.get("username"));
        stu.setJava(Double.parseDouble(stuMap.get("java")));
        stu.setMath(Double.parseDouble(stuMap.get("math")));
        return stu;
    }

    /**按java成绩从低到高分页查询*/
    public List<Stu> pageByJava(int page, int size) {
        int start = (page - 1) * size; 
        int end = start + size - 1; 
        
        List<String> ids = jedis.zrange("java:score", start, end);
        List<Stu> students = new ArrayList<>();
        
        for (String id : ids) {
            Stu stu = findById(Long.parseLong(id));
            if (stu != null) {
                students.add(stu);
            }
        }

        return students;
    }
}